package com.enzoism.springboot.util.common.crontasks;

import com.enzoism.springboot.util.common.redis.RedisUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

@Component
@Configuration      // 1.主要用于标记配置类，兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
@Async              // 3.开启异步线程操作
public class SaticScheduleTask {

    @Resource
    private RedisUtil redisUtil;

    /**默认是fixedDelay 上一次执行完毕时间后执行下一轮*/
    @Scheduled(cron = "0/5 * * * * *")
    public void run() throws InterruptedException {
        String redisKey = "REDIS_CRON_TASK";            // 要更新的数据
        String redisDoingKey = redisKey+"_ING";          // 标记当前任务正在执行

        // 查询是否当前定时任务是否有线程在跑，如果没有则执行
        try {
            String cronTask = (String)redisUtil.get(redisKey);
            String redisDoing = (String)redisUtil.get(redisDoingKey);
            if (!StringUtils.isEmpty(cronTask) && StringUtils.isEmpty(redisDoing)){
                System.out.println("--------------当前任务开始执行");
                redisUtil.set(redisDoingKey,"doing");
                // 模拟任务执行
                Thread.sleep(6000);
                // 任务执行完成之后删除"任务"+"任务执行标识"
                redisUtil.del(redisKey, redisDoingKey);
                System.out.println("--------------当前任务执行成功");
            }else if(!StringUtils.isEmpty(cronTask) && !StringUtils.isEmpty(redisDoing)){
                System.out.println("--------------当前任务正在执行");
            }else{
                System.out.println("--------------当前任务不存在");
            }
        }catch (Exception e){
            e.printStackTrace();
            // 一定要移除正在执行标识
            redisUtil.del(redisDoingKey);
        }finally {
            // 一定要移除正在执行标识
            redisUtil.del(redisDoingKey);
        }

        System.out.println(Thread.currentThread().getName()+"=====>>>>>定时任务执行");
    }

}